#include <iostream>
using namespace std;

int n,m;

int up[10005][105];
int num[10005][105];
int start; // 每一层开始的房间

int can_up[10005][105]; // 提取出来的能上楼的房间
int can_up_cnt[10005]; // 每一层的能上楼的房间的数量

long long ans; // int 4 ,2x10^9,long long 8 2x10^20

void init(){
    cin >> n >> m;
    for(int i =1;i<=n;i++){ //扫描每一层
        for(int j =0;j < m;j++){
            cin >> up[i][j];
            cin >> num[i][j];
            if( up[i][j] == 1){
                can_up[i][  can_up_cnt[i]++  ] = j; // 存下来能上楼的房间
            }
        }
    }
    cin >> start;
}

// void shang_lou(int ceng){
//     //start
//     int cnt = 0;
//     int need_cnt = num[ceng][start];
//     while( 1 ) {
//         if( up[ceng][start] == 1)
//             cnt++;
//         if( cnt == need_cnt) {
//             break;
//         }
//         start++;
//         if( start == m)
//             start = 0;
//     }
// }
void shang_lou(int ceng) {
    int need_cnt = num[ceng][start];
    int first_up = start;
    while(up[ceng][first_up] ==0) { // 找到第一个能上楼的房间的编号
        first_up++;
        if(first_up == m)
            first_up = 0;
    }
    //找到这个编号对应的在 can_up里的编号
    int pos1; // 第一个能上楼的房间的编号 在 can_up 里的编号是什么
    for(int i = 0 ;i< can_up_cnt[ceng];i++){
        if( can_up[ceng][i] == first_up){
            pos1 = i;
            break;
        }
    }
    // cout << ceng << " ";
    // cout << pos1 << " ";
    // cout << can_up[ceng][pos1] << endl;

    // 计算 在can_up 里 向后走 need_cnt-1的 房间是哪个
    int pos2 = (pos1+need_cnt -1) % can_up_cnt[ceng];

    // 返回这个can_up 存的编号
    start = can_up[ceng][pos2];

}



int main(){
    init();
    for(int i =1;i<=n;i++) { // 一层一层去上楼
        ans += num[i][start];
        //求出上一层所在的位置
        shang_lou(i);
    }
    cout << ans % 20123 << endl;
    
    return 0;
}
